<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // reduce()
    //reduce 为数组中的每一个元素依次执行回调函数，不包括数组中被删除或从未被赋值的元素，接受四个参数：初始值（或者上一次回调函数的返回值），当前元素值，当前索引，调用 reduce 的数组。

    var arr = [1, 2, 3, 4];
    var sum = arr.reduce((prev, value, index, arr) => { //
      console.log(prev, value, index); //1 2 1   3 3 2   6 4 3
      return prev + value;
    })
    console.log(arr, sum); //[1, 2, 3, 4] 10
    //index是从1开始的，第一次的prev的值是数组的第一个值。数组长度是4，但是reduce函数循环3次。

    var sum2 = arr.reduce((pre, val, index, arr) => {
      console.log(pre, val, index);
      return pre + val;
    }, 0)
    console.log(arr, sum2)
    // 如果没有提供initialValue，reduce 会从索引1的地方开始执行 callback 方法，跳过第一个索引。如果提供initialValue，从索引0开始。

    //求乘积mul
    var mul = arr.reduce((per, val) => per * val)
    console.log(mul);

    // //计算数组每个元素出现次数
    let names = ['Alice', 'Bob', 'Alice', 'Tiff', 'Bruce', 'Alice', 'Tiff'];
    let nameNum = names.reduce((pre, val) => {
      if (val in pre) {
        pre[val]++
      } else {
        pre[val] = 1
      }
      return pre
    }, {})
    console.log(nameNum) //{Alice: 3, Bob: 1, Tiff: 2, Bruce: 1}

    // 数组去重
    let arr1 = [1, 2, 3, 4, 4, 1]
    let newArry = arr1.reduce((pre, val) => {
      if (!pre.includes(val)) {
        return pre.concat(val)
      } else {
        return pre
      }
    }, [])
    console.log(newArry); // [1, 2, 3, 4]

    // // //二维数组转一维
    // let arr = [
    //   [0, 1],
    //   [2, 3],
    //   [4, 5]
    // ]
    // let newArr = arr.reduce((pre, cur) => {
    //   return pre.concat(cur)
    // }, [])
    // console.log(newArr); // [0, 1, 2, 3, 4, 5]

    // // //将多维数组转化为一维
    // let arr = [
    //   [0, 1],
    //   [2, 3],
    //   [4, [5, 6, 7]]
    // ]
    // const newArr = function (arr) {
    //   return arr.reduce((pre, cur) => pre.concat(Array.isArray(cur) ? newArr(cur) : cur), [])
    // }
    // console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]

    // // //对象里的属性求和
    // var result = [{
    //     subject: 'math',
    //     score: 10
    //   },
    //   {
    //     subject: 'chinese',
    //     score: 20
    //   },
    //   {
    //     subject: 'english',
    //     score: 30
    //   }
    // ];

    // var sum = result.reduce(function (prev, cur) {
    //   return cur.score + prev;
    // }, 0);
    // console.log(sum) //60
  </script>
</body>

</html>